#第一部分：sql解析
import os


#第一步：sql解析 流程
def sql_parse(sql): #用户输入sql 转成结构化的字典
    '''
    1.收到 sql查询条件
    2.sql_parse 来分发要求给 select_parse
    3.select_parse 调用 handle_parse 解析sql
    4.handle_parse 返回解析sql后的结果 sql_dic 给 select_parse
    5.select_parse 把 sql_dic 返回给sql_parse
    sql_dic=sql_parse(sql) #用户输入sql 转成结构化的字典sql_dic
    sql语句四种操作格式：insert delete update select
    提取用户输入sql 的操作关键词 再进行分析和分发操作
    把sql字符串切分，提取命令信息，分发给具体解析函数去解析
    :param sql:用户输入的字符串
    :return:返回字典格式sql解析结果
    '''
    #sql命令操作 解析函数的字典  根据用户的命令来找相对应的函数
    parse_func={
        'insert':insert_parse,
        'delete':delete_parse,
        'update':update_parse,
        'select':select_parse,
    }

    #print('用户输入 sql str is : %s' %sql) #打印用户输入的sql
    sql_l=sql.split(' ') #按空格切割用户sql 成列表 方便提取命令信息
    func=sql_l[0] #取出用户的sql命令

    #判断用户输入的sql命令 是否在定义好的sql命令函数的字典里面,如果不在字典里面，则返回空
    res=''
    if func in parse_func:
        res=parse_func[func](sql_l) #把切割后的 用户sql的列表 传入对应的sql命令函数里

    return res


def insert_parse(sql_l):
    '''
    定义insert语句的语法结构，执行sql解析操作，返回sql_dic
    :param sql:sql按照空格分割的列表
    :return:返回字典格式的sql解析结果
    '''
    sql_dic={
        'func':insert, #函数名
        'insert':[],   #insert选项,留出扩展
        'into':[],     #表名
        'values':[],   #值
    }
    return handle_parse(sql_l,sql_dic)


def delete_parse(sql_l):
    '''
    定义delete语句的语法结构，执行sql解析操作，返回sql_dic
    :param sql:sql按照空格分割的列表
    :return:返回字典格式的sql解析结果
    '''
    sql_dic = {
        'func': delete,
        'delete': [],  # delete选项,留出扩展
        'from': [],  # 表名
        'where': [],  # filter条件
    }
    return handle_parse(sql_l, sql_dic)


def update_parse(sql_l):
    '''
    定义update语句的语法结构，执行sql解析操作，返回sql_dic
    :param sql:sql按照空格分割的列表
    :return:返回字典格式的sql解析结果
    '''
    sql_dic = {
        'func': update,
        'update': [],  # update选项,留出扩展
        'set': [],  # 修改的值
        'where': [],  # filter条件
    }
    return handle_parse(sql_l, sql_dic)


def select_parse(sql_l):
    '''
    定义select语句的语法结构，执行sql解析操作，返回sql_dic
    :param sql:sql按照空格分割的列表
    :return:返回字典格式的sql解析结果
    '''
    # print('from in the select_parse :\033[42;1m%s\033[0m' %sql_l)
    # select语句多种条件查询，列成字典，不同条件不同列表
    sql_dic={
        'func':select, #执行select语句
        'select':[], #查询字段
        'from':[],   #数据库.表
        'where':[],  #filter条件，怎么找
        'limit':[],  #limit条件，限制
    }
    return handle_parse(sql_l,sql_dic)




#2.sql解析！
def handle_parse(sql_l,sql_dic): #专门做sql解析操作
    '''
    执行sql解析操作，返回sql_dic
    :param sql_l: sql按照空格分割的列表
    :param sql_dic: 待填充的字典
    :return: 返回字典格式的sql解析结果
    '''
    # print('sql_l is \033[41;1m%s\033[0m \nsql_dic is \033[41;1m%s\033[0m' %(sql_l,sql_dic))

    tag=False  #设置警报 默认是关闭False
    for item in sql_l:
        if tag and item in sql_dic: #判断警报拉响是True 并且用户sql的条件 在条件select语句字典里面，则关闭警报
            tag=False #关闭警报
        if not tag and item in sql_dic: #判断警报没有拉响 并且用户sql的条件 在条件select语句字典里面
            tag=True
            key=item #取出用户sql的条件
            continue

        if tag: #判断报警拉响
            sql_dic[key].append(item) #取除select/insert/update/delete对应的语句添加到字典中

    if sql_dic.get('where'): #判断where中是否存在判断条件
        sql_dic['where']=where_parse(sql_dic.get('where')) #['id>4','and','id<10'] #调用where_parse函数 把整理好的用户sql的where语句 覆盖之前没整理好的

    return sql_dic #返回 解析好的 用户sql 字典




def sql_action(sql_dic): #接收用户输入的sql 的结构化的字典  然后执行sql
    '''
    从字典sql_dic提取命令，分发给具体的命令执行函数去执行
    执行sql的统一接口,内部执行细节对用户完全透明
    :param sql_dic:
    :return:
    '''
    return sql_dic.get('func')(sql_dic) #接收用户sql，分发sql,执行命令



def insert(sql_dic):
    pass
def delete(sql_dic):
    pass
def update(sql_dic):
    pass
def select(sql_dic):
    pass





if __name__ == '__main__':  #程序主函数
    while True:
        sql=input("sql> ").strip()  #用户输入sql
        if sql == 'exit':break      #exit 随时退出
        if len(sql) == 0 :continue  #用户如果输入空，继续输入

        sql_dic=sql_parse(sql) #用户输入sql 转成结构化的字典sql_dic

        print('main res is %s' %sql_dic) #打印用户非法输入
        if len(sql_dic) == 0:continue  #如果用户输入等于0 不执行sql_action 让用户继续输入sql

        res=sql_action(sql_dic) #用户执行sql之后的结果res
        print('\033[43;1m%s\033[0m' %res[0])  #打印 select的条件
        for i in res[-1]:  # 循环打印 显示用户sql select的执行结果
            print(i)
